/*
 * @Description: vite config
 * @Author: HuiSir<273250950@qq.com>
 * @Date: 2022-01-24 14:04:37
 * @LastEditTime: 2025-09-24 10:13:46
 */
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import { createHtmlPlugin } from "vite-plugin-html";
import { viteMockServe } from "vite-plugin-mock";
import jsYaml from "js-yaml";
import viteYaml from "@modyfi/vite-plugin-yaml";
import externalGlobals from "rollup-plugin-external-globals";
import { loadEnv } from "vite";
import path from "node:path";
import fs from "node:fs";
import { ProjectConfig } from "./src/init/types";

/* eslint-disable @typescript-eslint/no-explicit-any */

// https://vitejs.dev/config/
export default defineConfig(({ command, mode }) => {
  // 读项目配置
  const project = jsYaml.load(
    fs.readFileSync("./project-config.yaml", "utf8")
  ) as ProjectConfig;

  return {
    base: "/",
    resolve: {
      // 路径缩写
      alias: {
        "@": path.resolve(__dirname, "./src"),
        // 配置运行时编译指向
        vue: "vue/dist/vue.esm-bundler.js",
      },
    },
    plugins: [
      vue(),
      viteYaml({
        include: ["*.yaml", "*.yml"],
        exclude: "pnpm-lock.yaml",
      }),
      createHtmlPlugin({
        // 初始化變量配置(传参到html)
        inject: {
          data: {
            TITLE: project.siteTitle,
            STYLES: project.styleResources,
            // 打包时再导入外部CDN，开发环境使用包管理
            SCRIPTS: command === "build" ? project.scriptResources : [],
          },
        },
      }),
      /**
       * vite-Mock插件（vue-cli是直接使用，无插件）
       * 开发环境是使用 Connect 中间件实现的。
       * 与生产环境不同，您可以在浏览器控制台中查看网络请求记录
       * https://gitee.com/wangchao2203/vite-plugin-mock
       */
      viteMockServe({
        ignore: /^_/, // 忽略以_开头的文件
        mockPath: "./src/mock", // 解析根目录下的mock文件夹
        supportTs: true, // 打开后，可以读取 ts 文件模块。 请注意，打开后将无法监视.js 文件。
        watchFiles: true, // 监视文件更改
        logger: false, // 关闭控制台请求日志
        localEnabled: mode === "dev", // 开发打包开关
        prodEnabled: false, // 生产环境关闭Mock
      } as any),
    ],
    // 環境變量配置
    define: {
      __BASE_API__: `'${loadEnv(mode, process.cwd()).VITE_BASE_API}'`,
    },
    json: {
      stringify: true, // 导入的 JSON 会被转换为 export default JSON.parse('...')
    },
    css: {
      preprocessorOptions: {
        scss: {
          charset: false, // 关闭打包时自动添加@charset规则，避免出现`css-syntax-error`提示警告
        },
      },
    },
    // 打包配置
    build: {
      target: "es2020",
      // 压缩
      minify: "esbuild",
      sourcemap: false, // 输出.map文件
      rollupOptions: {
        // 确保外部化处理不想打包进库的依赖
        // 外部包
        external: project.scriptResources.map((item) => item.dependence),
        plugins: [
          // 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量
          externalGlobals(getOutputGlobals(project.scriptResources)),
        ],
      },
    },
    server: {
      host: "0.0.0.0", // 定义0.0.0.0会放开防火墙，否则会有防火墙，其他IP设备无法访问
      port: 8000,
      open: true,
      proxy: project.devServerProxy,
      // 开发调试代理，这里固定采用字符串简写方式，不使用选项或正则写法，例如：
      // proxy: {
      //   '/foo': 'http://localhost:4567',
      // }
    },
  };
});

function getOutputGlobals(scriptResources: ProjectConfig["scriptResources"]) {
  const outputGlobals = {};
  scriptResources.forEach((item) => {
    outputGlobals[item.dependence] = item.globalVar;
  });
  return outputGlobals;
}
